//package leo.mystudy.executors;
//
///**
// * @author leo
// * @version 1.0.0
// * @description
// * @create 2022/2/28 16:49
// */
//public class R {
//
//    final void lock() {
//        //CAS操作设置state的值
//        if (compareAndSetState(0, 1)) {
//            //设置成功 直接将锁的所有者设置为当前线程 流程结束
//            setExclusiveOwnerThread(Thread.currentThread());
//        } else {
//            //设置失败 则进行后续的加入同步队列准备
//            acquire(1);
//        }
//    }
//
//    public final void acquire(int arg) {
//        //调用子类重写的tryAcquire方法 如果tryAcquire方法返回false 那么线程就会进入同步队列
//        if (!tryAcquire(arg) && acquireQueued(addWaiter(Node.EXCLUSIVE), arg)) selfInterrupt();
//    }
//
//    //子类重写的tryAcquire方法
//    protected final boolean tryAcquire(int acquires) {    //调用nonfairTryAcquire方法
//        return nonfairTryAcquire(acquires);
//    }
//
//    final boolean nonfairTryAcquire(int acquires) {
//        final Thread current = Thread.currentThread();
//        int c = getState();
//        //如果状态state=0，即在这段时间内 锁的所有者把锁释放了 那么这里state就为0
//        if (c == 0) {        //使用CAS操作设置state的值
//            if (compareAndSetState(0, acquires)) {
//                //操作成功 则将锁的所有者设置成当前线程 且返回true，也就是当前线程不会进入同步队列。
//                setExclusiveOwnerThread(current);
//                returntrue;
//            }
//        }
//        //如果状态state不等于0，也就是有线程正在占用锁，那么先检查一下这个线程是不是自己
//        else if (current == getExclusiveOwnerThread()) {
//            //如果线程就是自己了，那么直接将state+1，返回true，不需要再获取锁 因为锁就在自己身上了。
//            int nextc = c + acquires;
//            if (nextc < 0) // overflow
//                throw new Error("Maximum lock count exceeded");
//            setState(nextc);
//            return true;
//        }
//        //如果state不等于0，且锁的所有者又不是自己，那么线程就会进入到同步队列。
//        return false;
//    }
//
//}
//
